package control;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped;
import javax.inject.Inject;
import javax.inject.Named;

import entity.Fase;
import entity.Iteracao;
import entity.Projeto;
import entity.Fase.FaseRUP;

import service.ProjetoService;

@Named
@SessionScoped
public class PlanejarFasesControl implements Serializable {
	private static final long serialVersionUID = -6710190044398249033L;
	
	@EJB
	private ProjetoService service;
	
	@Inject
	private MenuControl menu;
	
	@Inject
	private AcompanharProjetoControl acompanharProjeto;
	
	private Projeto projeto;
	
	// Campos do modal Adicionar Iteracao
	private Integer faseSelecionada;
	private Integer iteracaoSelecionada;
	private String operacao;
	private Iteracao iteracao = new Iteracao();
	private String nomeIteracao;
	private Integer duracao;
	private Integer esforco;
	private String detalhes;
	
	private static final String OP_ADICIONAR = "Adicionar";
	private static final String OP_ALTERAR = "Alterar"; 
	
	public String iniciar() {
		projeto = service.planejarFases(menu.getIdProjetoSelecionado());
		
		return "/pages/projeto/planejar_fases";
	}

	public String novaIteracao() {
		iteracao = new Iteracao();
		nomeIteracao = null;
		duracao = null;
		esforco = null;
		detalhes = null;
		
		operacao = OP_ADICIONAR;
		return "";
	}
	
	public String adicionarIteracao() {
		if (OP_ADICIONAR.equals(operacao)) {
			iteracao.setNome(nomeIteracao);
			iteracao.setDetalhes(detalhes);
			iteracao.setDuracao(duracao);
			iteracao.setHorasEstimadas(esforco);
			service.adicionarIteracao(projeto.getId(), FaseRUP.get(faseSelecionada), iteracao);				
		} else if (OP_ALTERAR.equals(operacao)) {
			service.alterarIteracao(iteracao.getId(), nomeIteracao, detalhes, duracao, esforco);
		}
		
		projeto = service.obterProjeto(projeto.getId());
		
		return "";
	}
	
	public String removerFase() {
		projeto = service.removerFase(projeto.getId(), FaseRUP.get(faseSelecionada));		
		return "";
	}
	
	public String adicionarFase() {
		projeto = service.adicionarFase(projeto.getId(), FaseRUP.get(faseSelecionada));
		return "";
	}
	
	public String removerIteracao() {
		projeto = service.removerIteracao(projeto.getId(), FaseRUP.get(faseSelecionada), iteracaoSelecionada);
		
		return "";
	}
	
	public String editarIteracao()	{
		iteracao = projeto.getIteracao(FaseRUP.get(faseSelecionada), iteracaoSelecionada);
		
		nomeIteracao = iteracao.getNome();
		duracao = iteracao.getDuracao();
		esforco = iteracao.getHorasEstimadas();
		detalhes = iteracao.getDetalhes();
		
		operacao = OP_ALTERAR;
		return "";
	}
	
	public String finalizar() {
		service.finalizarPlanejamentoFases(projeto.getId());
		return acompanharProjeto.iniciar();
	}
	
	// getters & setters
	public List<Fase> getFases() {
		return projeto.getFases();
	}
	public String getNomeProjeto() {
		return projeto.getNome();
	}
	public Integer getHorasEstimadasProjeto() {
		return projeto.getHorasEstimadas();
	}
	public Date getInicioProjeto() {
		return projeto.getInicio();
	}
	public Date getFimProjeto() {
		return projeto.getFim();
	}
	
	public Integer getFaseSelecionada() {
		return faseSelecionada;
	}
	public void setFaseSelecionada(Integer faseSelecionada) {
		this.faseSelecionada = faseSelecionada;
	}
	
	public List<FaseRUP> getFasesNaoIncluidas() {
		List<FaseRUP> fasesNaoIncluidas = new ArrayList<Fase.FaseRUP>();
		for (FaseRUP f : FaseRUP.values()) {
			if (!projeto.possuiFase(f)) {
				fasesNaoIncluidas.add(f);
			}
		}
		return fasesNaoIncluidas;
	}
	public Integer getIteracaoSelecionada() {
		return iteracaoSelecionada;
	}
	public void setIteracaoSelecionada(Integer iteracaoSelecionada) {
		this.iteracaoSelecionada = iteracaoSelecionada;
	}
	public String getOperacao() {
		return operacao;
	}
	public String getNomeIteracao() {
		return nomeIteracao;
	}

	public void setNomeIteracao(String nomeIteracao) {
		this.nomeIteracao = nomeIteracao;
	}

	public Integer getDuracao() {
		return duracao;
	}

	public void setDuracao(Integer duracao) {
		this.duracao = duracao;
	}

	public Integer getEsforco() {
		return esforco;
	}

	public void setEsforco(Integer esforco) {
		this.esforco = esforco;
	}

	public String getDetalhes() {
		return detalhes;
	}

	public void setDetalhes(String detalhes) {
		this.detalhes = detalhes;
	}
}
